package com.qf.springbootproject.websocket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;

@Component
@ServerEndpoint("/webSocket/{oid}")
@Slf4j
public class WebSocketServer {
    //创建用于保存页面websocket连接对象的map对象
    static ConcurrentHashMap<String, Session> map = new ConcurrentHashMap<>();

    /**
     * 当客户端发起webSocket连接时，服务器端，要进行逻辑处理，写在这个方法里
     */
    @OnOpen            //javax.webSocket
    public void onOpen(Session session, @PathParam("oid") String oid) throws IOException {
        //直接给客户端握手
        session.getBasicRemote().sendText("from server" + oid);
        map.put(oid, session);
    }

    /**
     * 提供一个让外部调用的根据订单编号给对应页面发消息的方法
     */
    public static void sendMsg(String oid, String msg) throws IOException {
        Session session = map.get(oid);
        session.getBasicRemote().sendText(msg);

    }

    /**
     * 当客户端消息到达时，服务器如何进行处理
     *
     * @param session
     * @param msg：用来接收客户端发来的内容
     */
    @OnMessage
    public void onMsg(Session session, String msg) throws IOException {
        log.debug("收到客户端发来的消息");
        session.getBasicRemote().sendText("from server" + msg);
    }

    /**
     * 当客户端关闭连接时，如何处理的代码写在这里
     */
    @OnClose
    public void onClose(Session session, @PathParam("oid") String oid) {
        log.debug("客户端关闭连接了，oid={}", oid);
        map.remove(oid);
    }

    @OnError
    public void onError(Session session, @PathParam("oid") String oid,Throwable throwable) {
        log.debug("客户端连接出问题了,oid={}", oid);
    }
}










